/* Использование макросов */

#include <90s2313.h> 	// подключаем заголовочный файл используемого
// микроконтроллера AVR
/* Перед использованием макросов списков аргументов
переменной длины, подключим заголовочный файл stdarg.h */
#include <stdarg.h>

/* Объявим и определим функцию с переменным количеством
   аргументов, которая возвращает сумму всех аргументов */

/* Обязательный аргумент n в данной функции является количеством
   опциональных аргументов. Он непосредственно предшествует
   опциональным аргументам, которые обозначены многоточием.
   Следовательно, его имя должно быть использовано в макросе va_start
   в качестве аргумента previous_par */

int summa(int n, ...) 	// Объявляем и определяем функцию summa
{
va_list point; 	// Объявляем переменную point, типа va_list,
// point - указатель
// Тип va_list определен директивой typedef
// в файле stdarg.h.
int index, sum_int; 	// Объявляем целые переменные index - индекс
// и sum_int - сумма всех аргументов

sum_int=0; 			// инициализируем переменную sum_int

/* инициализируем указатель point */
va_start(point,n); 	// указателю point присваиваем адрес
// первого опционального аргумента функции,
// следующего за обязательным аргументом n,
// используя макрос va_start

/* добавим все опциональные аргументы функции,
   которые идут после n */
for (index=1; index<=n; index++) 	// цикл for
{
sum_int=sum_int+va_arg(point, int);	// последовательно
// прибавляем каждый
// аргумент к
// переменной sum_int,
// чтобы получить сумму
// всех аргументов
}

/* завершим использование указателя point */
va_end(point); 	// используем макрос va_end

return sum_int; 	// возвращаем сумму всех аргументов
}

/* Основная функция программы */
void main(void)
{
int summa_3arg; 			// объявляем целую переменную summa_3arg
// summa_3arg - сумма 3 аргументов
int summa_2arg; 			// объявляем целую переменную summa_2arg
// summa_2arg - сумма 2 аргументов

/* вычислим сумму 3 аргументов */
summa_3arg=summa(3,12,2,24); 	// вызываем функцию summa
// Первое число в списке аргументов -
// количество опциональных аргументов (3)
// Результат: summa_3arg=38

/* вычислим сумму 2 аргументов */
summa_2arg=summa(2,136,15); 	// вызываем функцию summa
// Первое число в списке аргументов -
// количество опциональных аргументов (2)
// Результат: summa_2arg=151
}
